package com.ayq.activiti.common.aop.aspect;

import com.ayq.activiti.common.exception.BusinessException;
import com.ayq.activiti.common.util.BaseEntity;
import com.ayq.activiti.common.util.Constant;
import com.ayq.activiti.common.util.GlobalHttpSessionUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 概念：最终控制列表中显示哪些 部门/人 创建的数据
 * 1、需要数据权限控制的列表， 需要有创建人字段， 示例：文章管理
 * 2、配置角色的数据范围（本部门，其他部门等）， 以及绑定的部门
 * 3、加个注解，用来查询当前等路人的多个角色（并集）， 根据角色数据范围， 获取绑定的部门id， 查关联的用户id
 * 4、在查某个模块的list或page的时候，手动queryWrapper.in(createId, 关联的用户id)
 *
 */
@Aspect
@Component
public class DataScopeAspect {

    @Autowired
    private GlobalHttpSessionUtils globalHttpSessionUtils;


    @Pointcut("@annotation(com.ayq.activiti.common.aop.annotation.DataScope)")
    public void dataScopePointCut() {
    }

    @Before("dataScopePointCut()")
    public void doBefore(JoinPoint point) {
        handleDataScope(point);
    }

    protected void handleDataScope(final JoinPoint joinPoint) {
        List<String> userIds = globalHttpSessionUtils.getUserIds();
        if (userIds.size() == 0 || userIds == null) {
            throw new BusinessException("无数据");
        }
        if ("all".equals(userIds.get(0))) {
            return;
        }
        Object params = joinPoint.getArgs()[0];
        if (params instanceof BaseEntity) {
            BaseEntity baseEntity = (BaseEntity) params;
            baseEntity.setCreateIds(userIds);
        }

    }

}
